/**
 * @file gh.cpp
 * @author your name (you@domain.com)
 * @brief 
 * @version 0.1
 * @date 2024-05-12
 * 
 * @copyright Copyright (c) 2024
 * 
 */

#include <iostream>
#include <chrono>
#include <thread>
#include <cassert>

/////////////////////////////////////////////////////////////////
// Объявление понятий предметной области

/**
 * @brief Понятие предметной области "реле"
 * 
 */
class Relay_interface
{
public:
    virtual ~Relay_interface() = default;

    virtual void turnOn() = 0;
    virtual void turnOff() = 0;
};

/**
 * @brief Понятие предметной области "схемы полива"
 * 
 */
class Watering_interface 
{
public:
    virtual ~Watering_interface() = default;

    virtual void go(Relay_interface & relay) = 0;
};

/////////////////////////////////////////////////////////////////
// Реализация понятий предметной области

class RelayTest : public Relay_interface
{
public:
    virtual void turnOn() override 
    {
        std::cout << "On" << std::endl;
    }

    virtual void turnOff() override 
    {
        std::cout << "Off" << std::endl;
    }

};

class SimpleWatering : public Watering_interface 
{
    int _tp;
    int _ti;

public:
    SimpleWatering() = delete;
    SimpleWatering(int tp, int ti) 
        : _tp(tp), _ti(ti) 
    {
        assert(tp > 0);
        assert(ti > 0);
    }

    virtual void go(Relay_interface & relay) override
    {
        while(true) {
            relay.turnOn();
            std::this_thread::sleep_for(std::chrono::seconds(_tp));
            relay.turnOff();
            std::this_thread::sleep_for(std::chrono::seconds(_ti));
        }
    }

};

/////////////////////////////////////////////////////////////////
// Алгоритм запуска программы

int main()
{
    RelayTest      relay;
    SimpleWatering watering(1,3);

    watering.go(relay);

    return 0;
}
